草庐IT

C++ ostringstream 奇怪的行为

全部标签

c++ - 类方法声明符中 noexcept 的行为

以下代码的预期行为是什么?使用GCC时输出为0,而使用clang时输出为1。哪一个是正确的?#includestaticconstboolne=false;structa{a()noexcept(ne){}staticconstboolne=true;};intmain(){std::cout 最佳答案 他们都是对的!这只是格式错误的代码。来自[basic.class.scope]:AnameNusedinaclassSshallrefertothesamedeclarationinitscontextandwhenre-evalu

c++ - 移位导致奇怪的类型转换

以下代码在没有警告的情况下编译:std::uint16_ta=12;std::uint16_tb=a&0x003f;但是,与按位一起执行移位会导致“隐式转换警告”:std::uint16_tb=(a&0x003f)gcc和clang都提示存在从int到uint16_t的隐式转换,但我不明白为什么引入移位会导致右watch达式为突然评估为int。编辑:对于clang,我使用-std=c++14-Weverything标志进行编译;对于gcc,我使用-std=c++14-Wall-Wconversion标志进行编译。 最佳答案 在使用整

c++ - 如何更改方法中不需要的行为

我们有一些类:structHttpRequest{std::stringurl;};structHttpResponse{intstatus_code;std::stringstatus_text;std::stringcontent;};structHttpClient{voidexecute(HttpRequestconst&req,HttpResponse&resp);};size_tappender(void*contents,size_tsize,size_tnmemb,void*userp){auto&ct=*reinterpret_cast(userp);size_tby

c++ - Clang 和 GCC 在解析可变函数模板重载时的不同行为

考虑这段代码:#includeintfoo_i(intx){returnx+1;}charfoo_c(charx){returnx+1;}usingII=int(*)(int);usingCC=char(*)(char);templatestructfn{Ff;templatedecltype(auto)operator()(Args&&...args)const{returnf(std::forward(args)...);}};structfn_2:privatefn,privatefn{fn_2(IIfp1,CCfp2):fn{fp1},fn{fp2}{}usingfn::ope

c++ - libstdc++ 和 libc++ : operator>> on bitset 行为差异

考虑以下代码:#include#include#includeintmain(intargc,char*argv[]){std::stringstreamstream;std::bitsetbitset(1);std::cout>bitset;std::cout在g++下用libstdc++编译,结果为:>g++bitset_empty.cpp-obitset_empty>./bitset_emptybefore=1after=1在clang++下用libc++编译,结果为:>clang++-stdlib=libc++bitset_empty.cpp-obitset_empty>./b

c++ - 在初始化列表的上下文中缩小的奇怪行为

有人知道为什么编译时没有警告吗intmain(){constinti=1024;std::initializer_listi_l={i};//nowarningreturn0;}但不会intmain(){constinti=pow(2,10);std::initializer_listi_l={i};//warningreturn0;}警告:non-constant-expressioncannotbenarrowedfromtype'int'to'unsignedlong'ininitializerlist[-Wc++11-narrowing]std::initializer_lis

c++ - 保存对象的析构函数地址并在以后调用它是否定义明确的行为?

我目前正在研究用C++编写的堆栈分配器。应该可以通过模板方法从此堆栈分配器获取对象。一旦调用另一个释放方法,这些对象就应该被销毁。在尝试使用不同的方法来实现析构函数的调用时,我偶然发现了以下内容:autodestructor=someObject->~SomeClass;destructor();析构函数似乎是被实际调用的,但这对我来说有点奇怪。我有以下问题:这是明确定义的行为吗?析构函数的类型是什么(我可以用什么替换auto关键字)?我能否将多个不同类型对象的所有析构函数地址保存在一个列表中,并在以后调用它们? 最佳答案 如评论所

c++ Eigen3 矩阵奇怪的行为

我正在尝试使用线性代数C++库Eigen3获取随机对称矩阵。我是这样做的:Eigen::MatrixXdm(3,3);m.setRandom();m=0.5*(m+m.transpose());但是结果是完全错误的。但是,如果我不重写m变量,而是像这样简单地将它输出到控制台:Eigen::MatrixXdm(3,3);m.setRandom();cout一切似乎都正常工作。我不明白问题出在哪里。是不是因为像转置这样的方法和像*和+这样的操作不会立即创建一个新矩阵,而是以一种惰性的方式创建新矩阵并持有对矩阵m的引用?但是我应该如何从官方文档中知道呢?像这样的行为不是极易出错吗?更新:是的

c++ - 没有虚拟继承的奇怪行为

这个问题在这里已经有了答案:multipleinheritance:unexpectedresultaftercastfromvoid*to2ndbaseclass(3个答案)关闭5年前。我正在处理一段表现出非常奇怪行为的代码。我设法在一个简单的helloworld风格的程序中复制了它,代码如下:#includeusingnamespacestd;classTest{public:virtual~Test()=default;protected:virtualvoidSetUp(){}};classICallbackReceiver{public:virtual~ICallbackRe

c++ - 不稳定的行为

我是C++的新手。小代码示例如下:intmain(intargc,char*argv[]){charch1;intint1;cin>>ch1;cin>>int1;cout当我运行程序并输入以下内容时:az我得到的输出是:a32767我理解“a”,但为什么整数值是32767?我只是想测试看看如果我使用“z”而不是分配给int1的数值会发生什么。我尝试输入:ax...我也得到了相同的结果。现在如果我使用shortint1而不是intint1并使用输入运行程序:az我得到输出:a0附言sizeof(int)=4sizeof(short)=2我使用的是64位机器。